//package com.ruoyi.common.core.mapper;
//
//import cn.xbatis.core.mybatis.mapper.MybatisMapper;
//import cn.xbatis.core.sql.executor.chain.QueryChain;
//import org.apache.ibatis.logging.Log;
//import org.apache.ibatis.logging.LogFactory;
//
//import java.util.List;
//
///**
// * 自定义 Mapper 接口, 实现 自定义扩展
// *
// * @param <M> mapper 泛型
// * @param <T> table 泛型
// * @param <V> vo 泛型
// * @author Lion Li
// * @since 2021-05-13
// */
//public interface BaseMapperPlus<M, T, V> extends MybatisMapper<T> {
//    //
//    Log log = LogFactory.getLog(BaseMapperPlus.class);
//    //
//    int DEFAULT_BATCH_SIZE = 1000;
//
//    //    //
////    default Class<V> currentVoClass() {
////        return (Class<V>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 2);
////    }
////
////    //
////    default Class<T> currentModelClass() {
////        return (Class<T>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1);
////    }
////
////    //
////    default Class<M> currentMapperClass() {
////        return (Class<M>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0);
////    }
//
//    //
//    default List<T> selectList() {
//        return QueryChain.of(this).list();
//    }
////
//
////    /**
////     * 批量插入
////     */
////    default boolean insertBatch(Collection<T> entityList) {
//////        return insertBatch(entityList, DEFAULT_BATCH_SIZE);
////        return false;
////    }
//////
////    /**
////     * 批量更新
////     */
////    default boolean updateBatchById(Collection<T> entityList) {
////        return updateBatchById(entityList, DEFAULT_BATCH_SIZE);
////    }
////
////    /**
////     * 批量插入或更新
////     */
////    default boolean insertOrUpdateBatch(Collection<T> entityList) {
////        return insertOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE);
////    }
////
//
////    /**
////     * 批量插入(包含限制条数)
////     */
////    default boolean insertBatch(Collection<T> entityList, int batchSize) {
////        for (int i = 0; i < entityList.size(); i++) {
////            this.save(entityList);
////        }
////        SqlSessionFactory sqlSessionFactory = null;
////        MybatisBatchUtil.batchSave(sqlSessionFactory, this.getClass(), entityList, batchSize);
////        String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.INSERT_ONE);
////        return SqlHelper.executeBatch(this.currentModelClass(), log, entityList, batchSize,
////            (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));
////    }
////
////    /**
////     * 批量更新(包含限制条数)
////     */
////    default boolean updateBatchById(Collection<T> entityList, int batchSize) {
////        String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.UPDATE_BY_ID);
////        return SqlHelper.executeBatch(this.currentModelClass(), log, entityList, batchSize,
////            (sqlSession, entity) -> {
////                MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
////                param.put(Constants.ENTITY, entity);
////                sqlSession.update(sqlStatement, param);
////            });
////    }
////
////    /**
////     * 批量插入或更新(包含限制条数)
////     */
////    default boolean insertOrUpdateBatch(Collection<T> entityList, int batchSize) {
////        TableInfo tableInfo = TableInfoHelper.getTableInfo(this.currentModelClass());
////        Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
////        String keyProperty = tableInfo.getKeyProperty();
////        Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
////        return SqlHelper.saveOrUpdateBatch(this.currentModelClass(), getClass(), log, entityList, batchSize, (sqlSession, entity) -> {
////            Object idVal = tableInfo.getPropertyValue(entity, keyProperty);
////            String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.INSERT_ONE);
////            return StringUtils.checkValNull(idVal)
////                || CollectionUtils.isEmpty(sqlSession.selectList(sqlStatement, entity));
////        }, (sqlSession, entity) -> {
////            MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
////            param.put(Constants.ENTITY, entity);
////            String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.UPDATE_BY_ID);
////            sqlSession.update(sqlStatement, param);
////        });
////    }
////
////    /**
////     * 插入或更新(包含限制条数)
////     */
////    default boolean insertOrUpdate(T entity) {
////        if (null != entity) {
////            TableInfo tableInfo = TableInfoHelper.getTableInfo(this.currentModelClass());
////            Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
////            String keyProperty = tableInfo.getKeyProperty();
////            Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
////            Object idVal = tableInfo.getPropertyValue(entity, tableInfo.getKeyProperty());
////            return StringUtils.checkValNull(idVal) || Objects.isNull(selectById((Serializable) idVal)) ? insert(entity) > 0 : updateById(entity) > 0;
////        }
////        return false;
////    }
////
////    default V selectVoById(Serializable id) {
////        return selectVoById(id, this.currentVoClass());
////    }
////
////    /**
////     * 根据 ID 查询
////     */
////    default <C> C selectVoById(Serializable id, Class<C> voClass) {
////        T obj = this.selectById(id);
////        if (ObjectUtil.isNull(obj)) {
////            return null;
////        }
////        return BeanCopyUtils.copy(obj, voClass);
////    }
////
////    default List<V> selectVoById(Collection<? extends Serializable> idList) {
////        return selectVoBatchIds(idList, this.currentVoClass());
////    }
////
////    /**
////     * 查询（根据ID 批量查询）
////     */
////    default <C> List<C> selectVoBatchIds(Collection<? extends Serializable> idList, Class<C> voClass) {
////        List<T> list = this.selectBatchIds(idList);
////        if (CollUtil.isEmpty(list)) {
////            return CollUtil.newArrayList();
////        }
////        return BeanCopyUtils.copyList(list, voClass);
////    }
////
////    default List<V> selectVoByMap(Map<String, Object> map) {
////        return selectVoByMap(map, this.currentVoClass());
////    }
////
////    /**
////     * 查询（根据 columnMap 条件）
////     */
////    default <C> List<C> selectVoByMap(Map<String, Object> map, Class<C> voClass) {
////        List<T> list = this.selectByMap(map);
////        if (CollUtil.isEmpty(list)) {
////            return CollUtil.newArrayList();
////        }
////        return BeanCopyUtils.copyList(list, voClass);
////    }
////
////    default V selectVoOne(Wrapper<T> wrapper) {
////        return selectVoOne(wrapper, this.currentVoClass());
////    }
////
////    /**
////     * 根据 entity 条件，查询一条记录
////     */
////    default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass) {
////        T obj = this.selectOne(wrapper);
////        if (ObjectUtil.isNull(obj)) {
////            return null;
////        }
////        return BeanCopyUtils.copy(obj, voClass);
////    }
////
////    default List<V> selectVoList(Wrapper<T> wrapper) {
////        return selectVoList(wrapper, this.currentVoClass());
////    }
////
////    /**
////     * 根据 entity 条件，查询全部记录
////     */
////    default <C> List<C> selectVoList(Wrapper<T> wrapper, Class<C> voClass) {
////        List<T> list = this.selectList(wrapper);
////        if (CollUtil.isEmpty(list)) {
////            return CollUtil.newArrayList();
////        }
////        return BeanCopyUtils.copyList(list, voClass);
////    }
////
////    default <P extends IPage<V>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper) {
////        return selectVoPage(page, wrapper, this.currentVoClass());
////    }
////
////    /**
////     * 分页查询VO
////     */
////    default <C, P extends IPage<C>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper, Class<C> voClass) {
////        IPage<T> pageData = this.selectPage(page, wrapper);
////        IPage<C> voPage = new Page<>(pageData.getCurrent(), pageData.getSize(), pageData.getTotal());
////        if (CollUtil.isEmpty(pageData.getRecords())) {
////            return (P) voPage;
////        }
////        voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass));
////        return (P) voPage;
////    }
////
//}
